/**
*      author: Y_Yao
*      created: 2024-10-27 12:14:38
**/

#include<bits/stdc++.h>


#define lc p<<1
#define rc p<<1|1
using namespace std;
using LL = long long;
const LL LLINF = 1e18;
const int INF = 0x3f3f3f3f;
const int N = 5e4 + 7;
int a[N];
int n,m,K,A,F,B;

struct node{
    int sum,l,r,add,ass;
}tr[4 * N];

void pushup(int p)
{
    tr[p].sum = tr[lc].sum + tr[rc].sum;
}

void pushdown(int p)
{
    if(tr[p].ass != -1)
    {
        tr[lc].sum = tr[rc].sum = 0;

        tr[lc].ass = tr[rc].ass = 0; 
        tr[lc].add = tr[rc].add = 0; 

        tr[p].ass = -1;
    }
    if(tr[p].add)
    {
        tr[lc].sum = tr[lc].sum + tr[p].add * (tr[lc].r - tr[rc].l + 1);
        tr[rc].sum = tr[rc].sum + tr[p].add * (tr[lc].r - tr[rc].l + 1);

        tr[lc].add += tr[p].add;
        tr[rc].add += tr[p].add;

        tr[p].add = 0;
    }
}

void build(int p,int l,int r)
{
    tr[p] = {0,lc,rc,0,-1};
    if(l == r) return;

    int mid = (l + r) >> 1;
    build(lc,l,mid);
    build(rc,mid + 1,r);
    pushup(p);
}

void updateadd(int p,int x,int y,int c = 1)
{
    if(x <= tr[p].l && tr[p].r <= y)
    {
        tr[p].sum += c * (tr[p].r - tr[p].l + 1);
        tr[p].add += c;
        return;
    }

    pushdown(p);
    int mid = (tr[p].l + tr[p].r) >> 1;
    if(x <= mid) updateadd(lc,x,y,c);
    if(y > mid) updateadd(rc,x,y,c);
    pushup(p);
}

void updateass(int p,int x,int y,int c = 0)
{
    if(x <= tr[p].l && tr[p].r <= y)
    {
        tr[p].sum = c * (tr[p].r - tr[p].l + 1);
        tr[p].add = 0;
        tr[p].ass = -1;
        return;
    }

    pushdown(p);
    int mid = (tr[p].l + tr[p].r) >> 1;
    if(x <= mid) updateass(lc,x,y,c);
    if(y > mid) updateass(rc,x,y,c);
    pushup(p);
}

int qurey(int p,int x,int y)
{
    if(x <= tr[p].l && tr[p].r <= y)
    {
        return tr[p].sum;
    }

    int mid = (tr[p].l + tr[p].r) >> 1;
    pushdown(p);
    int sum = 0;
    if(x <= mid) sum += qurey(lc,x,y);
    if(y > mid) sum += qurey(rc,x,y);
    return sum;
}

int geti(int x,int m)
{
    int l = x,r = n;
    while(l < r)
    {
        int mid = (l + r) >> 1;
        if(qurey(1,l,mid) >= m) r = mid;
        else l = mid + 1;
    }
    return l;
}

void solve()
{
    cin >> n >> m;
    while(m--)
    {
        build(1,1,n);
        cin >> K;
        if(K == 1)
        {
            cin >> A >> F;
            int cnt = qurey(1,A,n);
            if(!cnt) cout << "Can not put any one." << endl;
            else{
                int L = geti(A,1);
                int R = geti(A,min(F,cnt));
                updateass(1,L,R,0);
                cout << L << " " << R << endl;
            }
        }
        else if(K == 2)
        {
            cin >> A >> B;
            int cnt = B - A + 1 - qurey(1,A,B);
            cout << cnt << endl;
            updateadd(1,A,B,1);
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    int t = 1;
    cin >> t;
    while(t--)
    {
        solve();
    }
    return 0;
}



// #include <bits/stdc++.h>
// #define rep(i, n) for (int i = 1; i <= (n); ++i)
// using namespace std;
// typedef long long ll;
// const int N = 5E4 + 10;
// struct node {
//     int l, r;
//     int val;
//     int lazy;
// }t[N << 2];
// void pushdown(node& op, int lazy) {
//     op.val = lazy * (op.r - op.l + 1);
//     op.lazy = lazy;
// }
// void pushdown(int x) {
//     if (t[x].lazy == -1) return;
//     pushdown(t[x << 1], t[x].lazy), pushdown(t[x << 1 | 1], t[x].lazy);
//     t[x].lazy = -1;
// }

// void pushup(int x) { t[x].val = t[x << 1].val + t[x << 1 | 1].val; }

// void build(int l, int r, int x = 1) {
//     t[x] = { l, r, 1, -1 };
//     if (l == r) return;
//     int mid = l + r >> 1;
//     build(l, mid, x << 1), build(mid + 1, r, x << 1 | 1);
//     pushup(x);
// }

// void modify(int l, int r, int c, int x = 1) {
//     if (l <= t[x].l && r >= t[x].r) {
//         pushdown(t[x], c);
//         return;
//     }
//     pushdown(x);
//     int mid = t[x].l + t[x].r >> 1;
//     if (l <= mid) modify(l, r, c, x << 1);
//     if (r > mid) modify(l, r, c, x << 1 | 1);
//     pushup(x);
// }

// int ask(int l, int r, int x = 1) { //查询[l, r]区间的空花瓶数目
//     if (l <= t[x].l && r >= t[x].r) return t[x].val;
//     pushdown(x);
//     int mid = t[x].l + t[x].r >> 1;
//     int res = 0;
//     if (l <= mid) res += ask(l, r, x << 1);
//     if (r > mid) res += ask(l, r, x << 1 | 1);
//     return res;
// }

// int n, m;
// int getindex(int a, int c) { //找到[a, n]区间, 第c个可以放花瓶的位置
//     int l = a, r = n;
//     while (l < r) {
//         int mid = l + r >> 1;
//         if (ask(a, mid) >= c) r = mid;
//         else l = mid + 1;
//     }
//     return l;
// }
// int main()
// {
//     int T; cin >> T;
//     while (T--) {
//         scanf("%d %d", &n, &m);
//         build(1, n);
//         while (m--) {
//             int k, x, y; scanf("%d %d %d", &k, &x, &y);
//             if (k == 1) {
//                 int cou = ask(x + 1, n);
//                 if (!cou) printf("Can not put any one.\n");
//                 else {
//                     int L = getindex(x + 1, 1);
//                     int R = getindex(x + 1, min(y, cou)); //注意要和cou取一个min
//                     modify(L, R, 0);
//                     printf("%d %d\n", L - 1, R - 1);
//                 }
//             }
//             else {
//                 int res = y - x + 1 - ask(x + 1, y + 1);
//                 modify(x + 1, y + 1, 1);
//                 printf("%d\n", res);
//             }
//         }
//         puts("");
//     }
//     return 0;
// }